package fr.bludwarf.skywarrior.ile;

import fr.bludwarf.skywarrior.exceptions.ConstructionImpossibleException;
import fr.bludwarf.skywarrior.exceptions.EvenementInconnuOublieException;
import fr.bludwarf.skywarrior.exceptions.IleInconnueException;
import fr.bludwarf.skywarrior.global.EtatMonde;
import fr.bludwarf.skywarrior.global.Temps;
import fr.bludwarf.skywarrior.global.TimeFactorInconnu;
import fr.bludwarf.skywarrior.joueur.Joueur;
import fr.bludwarf.skywarrior.joueur.Ressources;
import fr.bludwarf.skywarrior.joueur.Unite;

public class Construction extends Progression<Ile>
{
	
	/** Unité en cours de construction */
	Unite _unite = null;
	
	public Construction(final Ile ile, final Unite unite) throws TimeFactorInconnu {
		super(ile);
		_unite = unite;
	}
	
	@Override
	public double getDureeEstimee(EtatMonde etatMonde) throws Exception
	{
		// Est-ce qu'il y a un architecte ou au moins un architecte prévu avant cette construction ?
		boolean architecte = false;
		final EtatIle etatIle = getEtatIle(etatMonde);
		if (etatIle.getNb(Batiment.ARCHITECTE) == 1 || etatIle.getNbPrevuAvant(Batiment.ARCHITECTE, this) >= 1)
		{
			architecte = true;
		}
		return _unite.getDuree() * Temps.getTimeFactor(_unite.getClass(), etatIle.pop(), architecte);
	}
	
	/**
	 * Recopie
	 * @param construction
	 */
	public Construction(Construction construction, Ile ile)
	{
		super(construction, ile);
		_unite = construction._unite;
	}

	public Construction(Construction construction)
	{
		super(construction);
		_unite = construction._unite;
	}

	/**
	 * @param temps
	 * @return le temps qui n'a pas été utilisé dans la construction (peut être utilisé pour la construction suivante), 0 si aucun temps restant
	 * @throws ConstructionImpossibleException si le bâtiment n'a pas été commencé
	 * @throws EvenementInconnuOublieException 
	 * @since 8 nov. 2011
	 */
	public double avancer(final double temps) throws Exception
	{
		// La construction a été commencée ?
		if (!aEteCommencee())
		{
			throw new ConstructionImpossibleException("Le bâtiment " + this + " n'a pas été commencé");
		}
		
		return super.avancer(temps);
	}

	public Unite getUnite() {
		return _unite;
	}

	public Ile getIle() {
		return getEntite();
	}
	
	public Ressources getCout()
	{
		return _unite.getCout();
	}
	
	public Joueur getJoueur()
	{
		return getIle().getJoueur();
	}

	public int getCoutPop() {
		return _unite.getPop();
	}

	public Ressources getCoutParCycle()
	{
		return getCout().parCycle(getDureeReelle());
	}

	/**
	 * @return 
	 * @throws IleInconnueException 
	 * 
	 */
	public EtatIle getEtatIle(EtatMonde etatMonde) throws IleInconnueException
	{
		return etatMonde.getEtatIle(getIle());
	}

	@Override
	public String getObjet()
	{
		return getUnite().getNom();
	}
	
}
